Jackson এর Custom Annotations ব্যবহার করে আপনি JSON Serialization এবং Deserialization এর জন্য আরো কাস্টমাইজড ও অ্যাডভান্সড ম্যাপিং কনফিগারেশন করতে পারেন। এই প্রক্রিয়া নির্দিষ্ট ফিল্ডগুলোর জন্য কাস্টম Serialization, Deserialization, বা Filtering সুবিধা প্রদান করে। Jackson এর বিল্ট-ইন অ্যানোটেশনগুলির বাইরে, আপনি নিজের অ্যানোটেশন তৈরি করে ফিল্ড বা ক্লাসগুলির জন্য কাস্টম লজিক প্রয়োগ করতে পারেন।
Custom Annotation তৈরি করে Advanced Mapping কনফিগার করা
Jackson ব্যবহারকারীরা যখন বিভিন্ন ফিল্ডের জন্য কাস্টম লজিক প্রয়োগ করতে চান, তখন Custom Annotation তৈরি করতে পারেন এবং এর সাহায্যে JSON এর কাঠামো কাস্টমাইজ করা যায়।
ধাপ ১: Custom Annotation তৈরি করা
প্রথমে, আপনাকে একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে যেটি Jackson-এ ম্যাপিং কনফিগার করতে ব্যবহৃত হবে। উদাহরণস্বরূপ, আমরা একটি কাস্টম অ্যানোটেশন তৈরি করব যা নির্দিষ্ট ফিল্ডের জন্য Serialization এবং Deserialization কাস্টমাইজ করবে।
কাস্টম অ্যানোটেশন উদাহরণ:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // Annotation will be available at runtime
public @interface CustomFormat {
String value() default "default_value"; // Default value for custom format
}
এখানে, আমরা একটি @CustomFormat অ্যানোটেশন তৈরি করেছি যা পরে ক্লাস বা ফিল্ডের উপর প্রয়োগ করা হবে এবং নির্দিষ্ট মান সংরক্ষণ করবে।
ধাপ ২: Custom Serializer তৈরি করা
Jackson-এ Custom Serializer তৈরি করতে হবে, যাতে আমাদের কাস্টম অ্যানোটেশন অনুসারে ফিল্ডের Serialization কাস্টমাইজ করা যায়।
Custom Serializer উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class CustomFormatSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
gen.writeString(value.toUpperCase()); // Custom logic: Convert to uppercase
} else {
gen.writeNull();
}
}
}
এখানে, CustomFormatSerializer ক্লাসে, আমরা কাস্টম Serialization লজিক লিখেছি যেখানে String টাইপের ফিল্ডগুলি uppercase-এ রূপান্তরিত হবে।
ধাপ ৩: Custom Annotation প্রয়োগ করা
এখন আমাদের কাস্টম অ্যানোটেশন এবং Serializer তৈরি হয়ে গেছে। আমাদের মূল অবজেক্টে এই কাস্টম অ্যানোটেশন প্রয়োগ করতে হবে।
কাস্টম অ্যানোটেশন প্রয়োগ উদাহরণ:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class Person {
private String name;
@CustomFormat
@JsonSerialize(using = CustomFormatSerializer.class) // Custom Serializer Applied
private String customField;
// Constructors, Getters, Setters
public Person(String name, String customField) {
this.name = name;
this.customField = customField;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
}
এখানে, আমরা customField নামের একটি ফিল্ডে @CustomFormat এবং @JsonSerialize(using = CustomFormatSerializer.class) অ্যানোটেশন প্রয়োগ করেছি, যা ওই ফিল্ডটির কাস্টম Serialization লজিক প্রয়োগ করবে।
ধাপ ৪: ObjectMapper দিয়ে Serialization
এখন Jackson এর ObjectMapper ব্যবহার করে ফিল্ডগুলোর Serialization করতে হবে। আমাদের কাস্টম অ্যানোটেশন অনুযায়ী customField ফিল্ডটির মান uppercase হবে।
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
// Create an object with custom field data
Person person = new Person("John Doe", "hello world");
// Create ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Serialize the object to JSON
String json = mapper.writeValueAsString(person);
System.out.println(json);
}
}
JSON Output:
{
"name": "John Doe",
"customField": "HELLO WORLD"
}
এখানে, customField ফিল্ডটির মান "hello world" ছিল, যা আমাদের কাস্টম Serializer এর মাধ্যমে "HELLO WORLD" হয়ে গেছে।
ধাপ ৫: Custom Deserializer তৈরি করা
এখন আমরা Custom Deserializer তৈরি করব, যাতে JSON থেকে ডেটা Deserialization করার সময় কাস্টম লজিক প্রয়োগ করা যায়।
Custom Deserializer উদাহরণ:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class CustomFormatDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getText();
if (value != null) {
return value.toLowerCase(); // Custom logic: Convert to lowercase
}
return null;
}
}
এখানে, CustomFormatDeserializer ক্লাসে, আমরা কাস্টম Deserialization লজিক লিখেছি, যেখানে JSON থেকে ডেটা পড়ার সময় স্ট্রিংটি lowercase হয়ে যাবে।
ধাপ ৬: Custom Deserializer প্রয়োগ করা
এখন, কাস্টম Deserializer প্রয়োগ করতে হবে:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Person {
private String name;
@CustomFormat
@JsonDeserialize(using = CustomFormatDeserializer.class) // Custom Deserializer Applied
private String customField;
// Constructors, Getters, Setters
public Person(String name, String customField) {
this.name = name;
this.customField = customField;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
}
Deserialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"John Doe\", \"customField\":\"HELLO WORLD\"}";
// Create ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Deserialize the JSON string into a Person object
Person person = mapper.readValue(json, Person.class);
// Print the deserialized object
System.out.println("Name: " + person.getName());
System.out.println("Custom Field: " + person.getCustomField());
}
}
Output:
Name: John Doe
Custom Field: hello world
এখানে, customField JSON থেকে "HELLO WORLD" ডেসিরিয়ালাইজ হয়ে "hello world" হয়ে গেছে, কারণ আমাদের কাস্টম Deserializer lowercase কনভার্সন করেছে
- Custom Annotations ব্যবহার করে Jackson এর Serialization এবং Deserialization কাস্টমাইজ করা যায়।
@JsonSerializeএবং@JsonDeserializeএর মাধ্যমে কাস্টম লজিক প্রয়োগ করা সম্ভব। - Custom Annotation তৈরি করে আপনি বিশেষ ধরনের ফিল্ড ম্যাপিং এবং কাস্টম ফিল্টারিং, ট্রান্সফরমেশন এবং কনভার্সন লজিক অ্যাড করতে পারেন।
- Jackson এর কাস্টম অ্যানোটেশন ব্যবহারের মাধ্যমে API এবং ডেটা মডেল উন্নয়ন আরও লচ্যন এবং কাস্টমাইজড করা সম্ভব।
Read more